package org.flyan.ffsm.core.action;

import org.flyan.ffsm.core.event.Event;
import org.flyan.ffsm.core.arg.Args;
import org.flyan.ffsm.core.state.State;

/**
 * 动作
 * <p>
 * 动作会被一个事件触发
 *
 * @param <ST> 状态标志
 * @param <ET> 事件标志
 * @author flyan
 * @version 1.0
 * @date 6/23/22
 * @since 1.0.0
 */
@FunctionalInterface
public interface Action<ST, ET> {

    /**
     * 发生动作
     *
     * @param event     触发该动作的事件
     * @param args      事件发生所携带的参数表
     * @return 动作完成时的新状态，也可能状态不会发生改变
     */
    State<ST, ET> act(Event<ST, ET> event, Args args);

}